package com.berchen.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    public RedisTemplate getRedisTemplate(){
        return redisTemplate;
    }

    /**
     * 往set中添加多个元素 元素不可以重复  重复的只会添加进去一个
     * @param key
     * @param vs
     */
    public void sadd(String key,Object vs){
        redisTemplate.opsForSet().add(key,vs);
    }

    /**
     * 一次性往 list 里面存储多个值
     * @param key
     * @param list
     */
    public void lPushAll(String key, List list){
        redisTemplate.opsForList().leftPushAll(key,list);
    }

    /**
     * 一次往list里面存储一个值
     * @param key
     * @param value
     */
    public void lPush(String key,Object value){
        redisTemplate.opsForList().leftPush(key,value);
    }

    /**
     * 从list左边取出一个元素
     * @param key
     * @return
     */
    public String lPop(String key){
        return redisTemplate.opsForList().leftPop(key).toString();
    }

    /**
     * String 将key 的数据自增 如果该值没有的话 会新建key 值为1
     * 该 key对应的值必须是数字 否则 会报错RedisCommandExecutionException: ERR value is not an integer or out of range
     * @param key
     * @return
     */
    public Long incr(String key){
        return redisTemplate.opsForValue().increment(key);
    }

    /**
     * String 往key中追加数据 如果key不存在 就会新建key保存该数据
     * @param key
     * @param value
     * @return
     */
    public Integer append(String key, String value){
        return redisTemplate.opsForValue().append(key,value);
    }
    /**
     * String 根据KEY删除数据
     * @param key
     * @return
     */
    public boolean del(String key){

        return redisTemplate.delete(key);
    }

    /**
     * 获取prefix 开头的 key的所有数据
     * @param prefix    不用加*号了  方法中自带了
     * @return
     */
    public List getByPrefix(String prefix){

        Set keys = redisTemplate.keys(prefix+"*");
        return redisTemplate.opsForValue().multiGet(keys);
    }

    /**
     * string 添加数据 不设置过期时间
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key,String value){
        boolean flag=false;
        try {
            redisTemplate.opsForValue().set(key, value);
            flag=true;
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * String 添加数据 设置过期时间
     * @param key
     * @param value
     * @param timeout
     * @param unit
     * @return
     */
    public boolean set(String key, String value, long timeout, TimeUnit unit){
        boolean flag=false;
        try {
            redisTemplate.opsForValue().set(key, value,timeout,unit);
            flag=true;
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    /**
     *  String 根据key获取数据
     * @param key
     * @return
     */
    public Object get(String key){
        return redisTemplate.opsForValue().get(key);
    }


    /**
     * 判断键是否存在
     * @param key
     * @return
     */
    public boolean exists(String key){
        return redisTemplate.hasKey(key);
    }

    /**
     * 获取过期时间
     * @param key
     * @return
     */
    public long expire(String key){
        return redisTemplate.getExpire(key);
    }

    /**
     * 获取过期时间 设置单位 自动转换
     * @param key
     * @param unit
     * @return
     */
    public long expire(String key,TimeUnit unit){
        return redisTemplate.getExpire(key,unit);
    }
}
